Skip to content

fix(gametheory,#12797): prose intermediaire runs CFR (13, 13d) — tranche 2 - #15961

Merged
jsboige merged 3 commits into
mainfrom
feature/12797-gt-cfr
Sep 14, 2026
Merged

jsboige merged 3 commits into
mainfrom
feature/12797-gt-cfr

Conversation

@jsboige

@jsboige jsboige commented Sep 13, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/notebook-python — lane myia-po-2024:CoursIA — prev: LIGHT/tooling #15588

Tranche 2 GameTheory/Python de #12797 : les 2 notebooks CFR portant encore un run >= 3 cellules code consecutives (mesure au claim, c.5652712327), + l'audit twin de re-baseline = 3 fichiers. Markdown-only — aucune cellule code touchée. Suite directe de #15957 (tranche 1, 5 notebooks).

Défauts éliminés (Classe B — étapes distinctes à sorties réelles sans prose intermédiaire)

Notebook Run éliminé Markdowns insérés
GameTheory-13-ImperfectInfo-CFR [40..42] briques de composition -> verify_product_decomposition -> verify_hull_bound 2 : le protocole de la vérif produit (les deux quantités que seul le théorème rend égales, écart attendu ~1e-12 = erreur machine, identité vs borne) ; la vérif eq. 4 (inégalité, quatre regrets sur la même trajectoire, capture avant observe)
GameTheory-13d-Optimistic-CFR [4..6] OFTRLSolver -> DCFRDiscountedSolver -> benchmark Kuhn 2 : le champion empirique DCFR (3 mécanismes discount/clip, pont avec le §1.3) ; l'instrument de mesure (même budget + même graine, ce que le proxy exploitabilité calcule)

Conventions locales respectées : 13 est non-accentué (comme sa prose existante), 13d accentué ; niveaux de titres continuent la structure (#### sous 8.1 pour 13, ### 1.4/### 1.5 pour 13d, entre §1.3 et ## 2. Verdict honnête).

Vérification (post-dernier-commit)

  • detect_consecutive_code_cells.py (organe advisory: detecter les cellules code consecutives dans les notebooks (opportunite markdown intermediaire / fusion) #12797) sur les 2 notebooks concernés : plus aucun run >= 3 ; max_run = 2 sur 13 (1 run de 2 préexistant ailleurs, autorisé), 1 sur 13d.
  • Cellules code byte-identiques vs origin/main : source + execution_count + outputs comparés cellule par cellule (assertion d'égalité stricte dans le splice) -> exception C.2 markdown-only.
  • detect_markdown_rendering.py --check : OK sur les 2 (aucune nouvelle violation ERROR).
  • Pre-commit : 9 hooks Passed (H.3 inclus), aucun rider cette fois.
  • Registre twin : 13 est une paire enregistrée (twin_pairs.d/gametheory-13-imperfectinfo-cfr.yaml, twin C# GameTheory-13-ImperfectInfo-CFR-Csharp.ipynb) -> re-baseline --pair "GameTheory-13 ImperfectInfo-CFR" --update --by myia-po-2024:CoursIA dans cette PR (audit 0012-2026-09-13-myia-po-2024-CoursIA.yaml, reason: renseignée, côté C# intact). Vérif --check --per-pair --base origin/main : voir commentaire de push. 13d n'est pas une paire enregistrée.

Périmètre (See #12797)

Livré cumulé tranches 1+2 : 7 notebooks Python GameTheory. Résiduel nommé (tranche 3) : 06-EvolutionTrust (run [29..31]), 06f-Bounded-Agents-Python (run [13..15]), + les jumeaux C#/Lean de la série.

🤖 Generated with Claude Code

jsboige and others added 2 commits September 13, 2026 12:32
Markdown-only : 2 cellules intermediaires par notebook pour couper les
runs >= 3 cellules code (13 : run [40..42] briques -> verif produit ->
verif hull ; 13d : run [4..6] OFTRL -> DCFR -> benchmark Kuhn).
Aucune cellule code touchee (source/execution_count/outputs identiques).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Audit du deplacement markdown-only du cote Python (#12797 tranche 2) :
verify --check --per-pair --base origin/main -> INTRO=0, exit 0.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Prose/output review needed in the notebooks this PR changed: a numeric value is not anchored, an explicit relation is contradicted, or its evidence is missing. These cases remain distinct in the JSON report; the signal is advisory, NOT a merge gate.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 2
  • Code cells validated: 33
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

@github-actions

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

@github-actions

github-actions Bot commented Sep 13, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 7.9s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 7.6s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 9.0s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 8.3s
Search-01-StateSpace.ipynb ✅ SUCCESS 7.3s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 5.1s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 49.1s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 5.3s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VERDICT: LGTM (vérifié: empreinte sha1 par cellule head↔base — 0 cellule code touchée)

[NanoClaw] — structural review

Vérification du claim central « Markdown-only »

Méthode : extraction des deux notebooks à 3a4ccee8 (head) et bb97e7ba (base), empreinte sha1 du source de chaque cellule, comparaison des ensembles :

  • GameTheory-13-ImperfectInfo-CFR.ipynb : 26 cellules code des deux côtés, ensembles d'empreintes identiques → aucune cellule code ajoutée, retirée ni modifiée (source ET outputs donc inchangés).
  • GameTheory-13d-Optimistic-CFR.ipynb : 7/7, empreintes identiques → idem.
  • Côté markdown : 0 cellule retirée ou modifiée, 4 insertions pures (cellules head 41/43 dans le 13, 5/7 dans le 13d) — cohérent avec +31/+26 lignes.

La revendication du body tient exactement. Les 4 insertions tombent bien dans les runs ≥3 cellules code consécutifs visés par #12797.

Contenu des 4 cellules ajoutées (lues intégralement)

  • 13, cell 41 (Théorème 4.1 produit) : contraste pédagogique juste entre identité exacte (R^X + R^Y = regret produit en calcul direct, écart attendu ~1e-12 sur T=3000) et borne — « vérifier une identité ≠ tenir une borne ». L'exactitude tient mathématiquement : le couplage 0.05(x−y) entre comme décalages additifs de chaque côté, la somme reste séparable, la minimisation se distribue.
  • 13, cell 43 (Équation 4, enveloppe convexe) : décrit correctement la borne R^co ≤ R^Δ² + max{R^X, R^Y} et les deux subtilités d'implémentation réelles (stratégie enveloppe capturée avant observe, regret du mixeur sur les pertes réelles des experts) — les symboles MiniRegret/ConvexHullMixer/verify_hull_bound existent dans les cellules code inchangées (grep 8/3/2 occurrences).
  • 13d, cell 5 (DCFR) : description fidèle de Brown & Sandholm (2019) — discount des regrets t/(t+α), discount de somme de stratégies (t/(t+β))² désactivé par défaut (β=0, c'est la config recommandée du papier), clipping CFR+. « Meilleure garantie théorique à l'optimiste, première place empirique au DCFR » est cohérent avec la littérature.
  • 13d, cell 7 (instrument de mesure) : même budget d'itérations + graine commune (np.random.seed, 3 occurrences dans le code), perf_counter pour le temps, proxy d'exploitabilité annoncé comme proxy en démo — honnêteté méthodologique correcte, l'attente §1.3 est explicitement suspendue aux chiffres de la section 2.

Audit twin YAML

0012-2026-09-13-myia-po-2024-CoursIA.yaml : shas Python/C# tracés, csharp_sha = HEAD (côté C# intact), motifs et précédents (2026-08-05, 2026-07-25) cités — la discipline de re-baseline des tranches précédentes est maintenue.

Divers

Scan sécurité (tokens/clés) sur le contenu intégral des deux notebooks : 0 hit. Rien à signaler.

Tranche 2 conforme à l'objectif #12797 : la prose insérée raconte le code existant sans le toucher, et ce qu'elle raconte est juste.

…14911/#15345)

Le re-baseline de la tranche 2 a pose 0012 alors que la paire portait
deja 0012-2026-09-01 (po-2023-CoursIA-2) -- l'index NNNN est la cle de
tri du journal et doit etre unique par paire. Renomme en 0013 (premier
index libre). test_twin_registry_integrity : 46 passed.

See #15961

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@jsboige

jsboige commented Sep 13, 2026

Copy link
Copy Markdown
Owner Author

Diagnostic des 2 rouges du run précédent (head b4e07a2), tous deux non-substantiels :

@jsboige

jsboige commented Sep 13, 2026

Copy link
Copy Markdown
Owner Author

DWELL mecanique — justification ecrite (aucun geste de cette lane).

Verdict du PR gate (check-run 103722284946, tete b4e07a27fd) :

[pr-gate] DWELL -- tete du 2026-09-13T11:37:18Z, 42 min -- plancher 120 min, reste 78 min, leve au premier balayage suivant 2026-09-13T13:37:18Z. Le balayage horaire (pr-gate-stale-sweep.yml, cron '7 * * * *') re-agrege cette jambe des que le plancher est ecoule ; aucun geste manuel n'est requis. Urgence (main rouge) : poser le label merge-dwell-waived sur la PR.

Les autres checks de cette tete sont tous verts (0 non-vert hors PR gate, verifie sur commits/b4e07a27fd/check-runs?per_page=100). Le plancher se mesure sur la committer date de la tete : un nouveau push relance les 120 min au lieu de les ecourter, et un rerun avant l'echeance re-DWELL a l'identique — les deux sont donc ecartes deliberement. Rien a reparer dans cette PR. Le balayage horaire pr-gate-stale-sweep.yml (cron 7 * * * *) re-agrege cette jambe des que le plancher est ecoule.

Cette ligne est ecrite ici parce que le P0 « reparer son propre rouge » du picker lit le verdict du PR gate sans lire le log : --ignore-red s'appuie sur ce commentaire, et l'echappatoire se justifie par ecrit, pas en silence.

@jsboige

jsboige commented Sep 13, 2026

Copy link
Copy Markdown
Owner Author

DWELL — plancher mecanique, rien a reparer.

PR gate est rouge sur le verdict : DWELL -- tete du 2026-09-13T11:37:18Z, 42 min -- plancher 120 min, reste 78 min, leve au premier balayage suivant 2026-09-13T13:37:18Z. Le balayage horaire (pr-gate-stale-sweep.yml, cron 7 * * * *) re-agrege cette jambe des que le plancher est ecoule ; aucun geste manuel n'est requis.

Aucune action de lane n'est disponible sur cette PR : ni re-push (il remettrait le plancher a zero depuis la nouvelle tete), ni gh pr update-branch (meme effet), ni correction de substance — le verdict ne nomme aucun defaut a corriger.

Justification ecrite exigee par le picker pour l'echappatoire --ignore-red : le rouge n'est pas tu, il est qualifie comme plancher mecanique auto-leve.

— lane myia-po-2024:CoursIA

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants